<?php

namespace controllers;

use system\Auth;
use system\Factory;
use system\Model;
use system\Tool\Upload;

class AdminApi extends Api {
    use Auth;
    protected        $verifyType = 1;
    protected static $pageSize   = 10;
    /**
     * @var Model $model
     */
    protected $model = '';
    protected $error = '';

    /**
     * 初始化操作
     */
    public function onConstruct(){
        parent::__construct();
        $this->onStepUp();
    }

    public function onStepUp(){

    }

    /**
     * 获取校验用户的UID
     * @return string
     */
    protected function getAuthUid() {
        return $this->uid;
    }

    /**
     * 获取权限验证的命名空间
     * @return string
     */
    protected static function getNameSpace() {
        return 'admin';
    }

    /**
     * 权限校验失败时
     */
    protected function onDied() {
        exit(error('Access Died!', 403));
    }

	/**
	 * 不进行权限校验的白名单
	 * @return string[]
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-23 上午9:46
	 */
    protected function whiteList() {
        return [
            '/admin/Index/status',
            '/admin/Index',
            '/admin/verify',
            '/admin/user/login',
            '/admin/getNavs',
            '/admin/Index/logout'
        ];
    }

    /**
     * 返回一个json数据
     *
     * @param       $list
     * @param       $count
     * @param array $data
     *
     * @return array
     */
    protected static function returnJson($list, $count = 0, $data = []) {
        $json = [
            'code'  => 0,
            'msg'   => '暂无数据',
            'data'  => $list,
            'count' => $count,
        ];
        if ($data) {
            $json = array_merge($json, $data);
        }
        // 页面信息支持
		if ($pageInfo = static::setPageInfo()){
			$json['pageInfo'] = $pageInfo;
		}
        return $json;
    }

	/**
	 * 设置页面信息
	 * @return array
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-30 下午3:45
	 */
	protected static function setPageInfo(){
		$page = [];
		$page['title'] = static::setPageTitle();
		$page['crumbs'] = static::setCrumbs();
		return $page;
	}

	/**
	 * 获取页面标题
	 * @return string
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-30 下午3:45
	 */
	protected static function setPageTitle(){
		return '';
	}

	/**
	 * 获取面包屑导航
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-30 下午3:21
	 */
	protected static function setCrumbs(){
		return [];
	}

    /**
     * 图片生成base64
     *
     * @param $image_file
     *
     * @return string
     */
    protected static function base64EncodeImage($image_file) {
        $image_info   = @getimagesize($image_file);
        $image_data   = @fread(fopen($image_file, 'r'), filesize($image_file));
        $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));

        return $base64_image;
    }

    /**
     * 获取请求的鼠键
     *
     * @param string $defaultStart
     * @param string $defaultEnd
     *
     * @return array|string
     */
    protected function getRequestTime($defaultStart = '', $defaultEnd = '') {
        $time = values('get.time');
        if ($time) {
            return explode(' ~ ', $time);
        }
        if ($defaultStart == '') {
            return '';
        }

        return [$defaultStart, $defaultEnd];
    }

    /**
     * 上传图片
     * @param string $image 要上传的图片地址
     * @param string $oldImage 原来的图片（提供了此地址，将会删除此文件）
     * @param string $newPath 新图片地址的名称
     * @return bool|string
     */
    protected function uploadImg($image , $oldImage = '' , $newPath = ''){
        if (!$image){
            return false;
        }
        $upload = false;
        $image = getValidImage($image);
        if(Upload::isTmp($image)){
            $image = Upload::moveUpload($image);
            if (!$image){
               return false;
            }
            $upload = true;
        }
        if ($upload && $oldImage){
            if (strpos('/' , $oldImage) === 0){
                $oldImage = ltrim($oldImage , '/');
            }
            Factory::File()->removeFile($oldImage);
        }
        return $image;
    }

    /**
     * 更新前操作
     * @param array $data
     * @return bool
     */
    protected function onUpdateBefore(&$data = []){
        return true;
    }

    /**
     * 更新后操作
     * @param int|bool $status
     * @param array $data
	 * @param array $find 更新前数据
     * @return bool
     */
    protected function onUpdateAfter($status , &$data = [] , $find = []){
        return true;
    }

    /**
     * 编辑或添加
     * @return string
     */
    public function edit(){
        if (self::$post){
            if(!$this->onUpdateBefore(self::$post)){
                return error($this->error ? $this->error : '预处理失败');
            }
            $data = $this->model->create(self::$post);
            $this->model->startTransaction();
            if (self::$post['id']){
				$find = $this->model->where(['id' => self::$post['id']])->find();
                $status = $this->model->update($data);
            }else{
            	$find = [];
                $status = $this->model->insert($data);
            }
            if(!$this->onUpdateAfter($status , $data , $find)){
                $this->model->rollback();
                return error($this->error ? $this->error : '处理失败');
            }
            $this->model->commit();
            return success('操作成功');
        }else{
        	$res = $this->onFind();
        	if ($res){
        		return success($res);
			}else{
				return success($this->getFind());
			}
		}
    }

	/**
	 * 查询数据
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-20 下午2:24
	 * @return array
	 */
    protected function onFind(){
		return [];
	}

    /**
     * 删除前处理
     * @param array $find
     * @return bool
     */
    protected function onDeleteBefore($find = []){
        return true;
    }

    /**
     * 删除后操作
     * @param bool $status       删除状态
     * @param array $find        查询的数据
     * @return bool
     */
    protected function onDeleteAfter($status , $find = []){
        return true;
    }

    /**
     * 删除方法
     * @param string $id
     * @return string
     */
    public function delete($id = ''){
        if ($id){
            $find = $this->model->getFind($id);
            if ($find){
                if(!$this->onDeleteBefore($find)){
                    return error($this->error ? $this->error : '预处理失败');
                }
                $this->model->startTransaction();
                $status = $this->model->delete($id);
                if(!$this->onDeleteAfter($status , $find)){
                    $this->model->rollback();
                    return error($this->error ? $this->error : '处理失败');
                }
                $this->model->commit();
                return success('删除成功');
            }
            return error('数据不存在');
        }
    }

	/**
	 * 根据ID，获取数据
	 * @return array|int|string
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-20 下午2:30
	 */
    protected function getFind(){
    	$model = [];
		if (self::$get['id']){
			$model = $this->model->getFind(self::$get['id']);
		}
		return $model;
	}

	/**
	 * 把指定的key=>array数据，转换成 id => title 数据
	 * @param $array
	 * @param string $key
	 * @param string $value
	 * @return array
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-27 下午5:16
	 */
	protected function getSelectArrays($array , $key = '' , $value = ''){
    	$arrays = [];
    	foreach ($array as $val){
			$arrays[$val[$key]] = $val[$value];
		}
    	return $arrays;
	}

	/**
	 * 获取下拉选项信息
	 * @param $array
	 * @param string $selected
	 * @author Colin <amcolin@126.com>
	 * @date 2021-12-20 下午2:34
	 * @return array
	 */
	protected function getSelectOptions($array , $selected = ''){
    	$options = [];
    	foreach ($array as $key => $value){
    		$options[] = [
    			'id' => $key ,
				'name' => $value ,
				'selected' => $selected == $key ,
			];
		}
    	return $options;
	}

    /**
     * 删除图片
     * @param $image
     */
    protected function deleteImage($image){
        if ($image){
            unlink(ltrim($image , '/'));
        }
    }
}
